package com.ezjie.ielts.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Cap;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

import com.ezjie.ielts.R;
import com.ezjie.ielts.util.DensityUtil;

/**
 * 仿iphone带进度的进度条，线程安全的View，可直接在线程中更新进度 筛选时间 进度
 * 
 * @author renyangyang
 * 
 */
public class FilterTimeRoundProgressBar extends View {
	/**
	 * 画笔对象的引用
	 */
	private Paint paint;

	/**
	 * 圆环的颜色
	 */
	private int roundColor;

	/**
	 * 圆环进度的颜色
	 */
	private int roundProgressColor;

	/**
	 * 中间进度百分比的字符串的颜色
	 */
	private int textColor;

	/**
	 * 中间进度百分比的字符串的字体
	 */
	private float textSize;

	/**
	 * 圆环的宽度
	 */
	private float roundWidth;

	/**
	 * 最大进度
	 */
	private int inMax;
	private int outMax;

	/**
	 * 内圆 当前进度
	 */
	private int inProgress;
	// 外圆 进度
	private int outProgress;
	/**
	 * 是否显示中间的进度
	 */
	private boolean textIsDisplayable;

	/**
	 * 进度的风格，实心或者空心
	 */
	private int style;

	public static final int STROKE = 0;
	public static final int FILL = 1;

	public FilterTimeRoundProgressBar(Context context) {
		this(context, null);
	}

	public FilterTimeRoundProgressBar(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public FilterTimeRoundProgressBar(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		paint = new Paint();

		TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar);

		// 获取自定义属性和默认值
		roundColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.GRAY);
		roundProgressColor = mTypedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN);
		textColor = mTypedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.GREEN);
		textSize = mTypedArray.getDimension(R.styleable.RoundProgressBar_textSize, 15);
		roundWidth = mTypedArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 40);// 圆环的宽度
		inMax = mTypedArray.getInteger(R.styleable.RoundProgressBar_max, 100);// 圆环最大进度
		textIsDisplayable = mTypedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, false);// 不显示中间的进度
		style = mTypedArray.getInt(R.styleable.RoundProgressBar_style, 0);
		mTypedArray.recycle();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		/**
		 * 画最外层的大圆环
		 */
		int firstRoundWidth = DensityUtil.dip2px(getContext(), 1);
		int centre = getWidth() / 2; // 获取圆心的x坐标
		int radius = centre - firstRoundWidth / 2; // 圆环的半径
		RectF oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限

		paint.setColor(Color.rgb(232, 232, 232)); // e8e8e8 设置圆环的颜色
		paint.setStyle(Paint.Style.STROKE); // 设置空心
		paint.setStrokeWidth(firstRoundWidth); // 设置圆环的宽度
		paint.setAntiAlias(true); // 消除锯齿
		paint.setStrokeCap(Cap.ROUND);// 设置笔刷的形状
		canvas.drawArc(oval, -90, 360, true, paint);
		/**
		 * 画一层灰色的圆
		 */
		radius = centre - (firstRoundWidth); // 圆环的半径 大圆半径-2
		oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
		paint.setColor(Color.rgb(235, 235, 235)); // 设置圆环的颜色
		paint.setStyle(Paint.Style.FILL); // 设置空心
		paint.setStrokeWidth(firstRoundWidth); // 设置圆环的宽度
		paint.setAntiAlias(true); // 消除锯齿
		paint.setStrokeCap(Cap.ROUND);// 设置笔刷的形状
		canvas.drawArc(oval, -90, 360, true, paint);

		/**
		 * 画外层 ，画圆环的进度
		 */
		paint.setColor(Color.rgb(255, 174, 0)); // ffb200 设置圆环的颜色
		paint.setStyle(Paint.Style.STROKE); // 设置空心
		paint.setStrokeWidth(firstRoundWidth); // 设置圆环的宽度
		paint.setAntiAlias(true); // 消除锯齿
		paint.setStrokeCap(Cap.ROUND);// 设置笔刷的形状
		if (outProgress != 0) {
			canvas.drawArc(oval, -90, 360 * outProgress / outMax, false, paint); // 根据进度画圆弧
		}

		/**
		 * 画内层 ，画圆环的进度
		 */
		radius = centre - (firstRoundWidth); // 圆环的半径 大圆半径-2
		oval = new RectF(centre - radius, centre - radius, centre + radius, centre + radius); // 用于定义的圆弧的形状和大小的界限
		paint.setColor(Color.rgb(223, 223, 223)); // ffb200 设置圆环的颜色
		paint.setStyle(Paint.Style.FILL); // 设置空心
		paint.setStrokeWidth(firstRoundWidth); // 设置圆环的宽度
		paint.setAntiAlias(true); // 消除锯齿
		paint.setStrokeCap(Cap.ROUND);// 设置笔刷的形状
		if (inProgress != 0) {
			canvas.drawArc(oval, -90, 360 * inProgress / inMax, true, paint); // 根据进度画圆弧
		}

	}

	public synchronized int getInMax() {
		return inMax;
	}

	public synchronized int getOutMax() {
		return outMax;
	}

	/**
	 * 设置进度的最大值
	 * 
	 * @param max
	 */
	public synchronized void setInMax(int max) {
		if (max < 0) {
			throw new IllegalArgumentException("max not less than 0");
		}
		this.inMax = max;
	}

	public synchronized void setOutMax(int max) {
		if (max < 0) {
			throw new IllegalArgumentException("max not less than 0");
		}
		this.outMax = max;
	}

	/**
	 * 获取进度.需要同步
	 * 
	 * @return
	 */
	public synchronized int getInProgress() {
		return inProgress;
	}

	public synchronized int getOutProgress() {
		return outProgress;
	}

	/**
	 * 设置进度，此为线程安全控件，由于考虑多线的问题，需要同步 刷新界面调用postInvalidate()能在非UI线程刷新
	 * 
	 * @param progress
	 */
	public synchronized void setInProgress(int progress) {
		if (progress < 0) {
			throw new IllegalArgumentException("progress not less than 0");
		}
		if (progress > inMax) {
			progress = inMax;
		}
		if (progress <= inMax) {
			this.inProgress = progress;
			postInvalidate();
		}

	}

	public synchronized void setOutProgress(int progress) {
		if (progress < 0) {
			throw new IllegalArgumentException("progress not less than 0");
		}
		if (progress > outMax) {
			progress = outMax;
		}
		if (progress <= outMax) {
			this.outProgress = progress;
			postInvalidate();
		}

	}

	public int getCricleColor() {
		return roundColor;
	}

	public void setCricleColor(int cricleColor) {
		this.roundColor = cricleColor;
	}

	public int getCricleProgressColor() {
		return roundProgressColor;
	}

	public void setCricleProgressColor(int cricleProgressColor) {
		this.roundProgressColor = cricleProgressColor;
	}

	public int getTextColor() {
		return textColor;
	}

	public void setTextColor(int textColor) {
		this.textColor = textColor;
	}

	public float getTextSize() {
		return textSize;
	}

	public void setTextSize(float textSize) {
		this.textSize = textSize;
	}

	public float getRoundWidth() {
		return roundWidth;
	}

	public void setRoundWidth(float roundWidth) {
		this.roundWidth = roundWidth;
	}

}
